home *** CD-ROM | disk | FTP | other *** search
/ Universität Tübingen - 1997/1998 Winter / Universität Tübingen - Wintersemester 1997-98 - Uni-Informationssystem und Stadt-Informationssystem.iso / bcm / cell2.jav < prev    next >
Text File  |  1997-08-14  |  9KB  |  369 lines

  1. // ----------------------------------------------------------------------------
  2. //   $Header: D:/users/moroff/java/cell2/RCS/cell2.java 1.5 1996/12/11 20:30:16 moroff Exp moroff $
  3. //   $Source: D:/users/moroff/java/cell2/RCS/cell2.java $
  4. // $Revision: 1.5 $
  5. //     $Name:  $
  6. //     $Date: 1996/12/11 20:30:16 $
  7. //   $Locker: moroff $
  8. // ----------------------------------------------------------------------------
  9. // Cellular Automata Applet
  10. // ----------------------------------------------------------------------------
  11.  
  12. import java.applet.*;
  13. import java.awt.*;
  14.  
  15. // Cellular Automata Class
  16. public class cell2 extends Applet implements Runnable
  17. {
  18.     // Declare Variables
  19.     int       arraySize = 20,
  20.                 cellHeight,
  21.                 cellWidth;
  22.     byte       cells[][],
  23.                 next[][];
  24.     boolean    initPaint  = true;
  25.     int        waitTime   = 50;
  26.     int        threshHold = 2;
  27.     byte        immStates  = 1,
  28.                 infStates  = 1;
  29.     boolean    threadRunning = false;
  30.     Thread   ttapeThread = null;
  31.     Image    im;
  32.     Graphics osGraphics;
  33.  
  34.     // Controls
  35.     Panel         pnlCtrl       = new Panel  ();
  36.     Button     btnStart      = new Button ("Start"),
  37.                  btnStop       = new Button ("Stop"),
  38.                  btnCont       = new Button ("Continue");
  39.     Label     lblThreshhold = new Label  ();
  40.     Label         lblImmStates  = new Label  (),
  41.                  lblInfStates  = new Label  ();
  42.  
  43.     /** Initialize Applet, ▄berladung der init()-Methode von java.applet.Applet */
  44.     public void init(){
  45.  
  46.     // Gr÷▀e der Zellen berechnen
  47.  
  48.     // Graphik-Buffer erzeugen
  49.         im=createImage(size().height, size().height);
  50.         osGraphics = im.getGraphics();
  51.  
  52.     // Buttons hinzufⁿgen
  53.         pnlCtrl.setLayout (new GridLayout(16,1));
  54.         pnlCtrl.setBackground (Color.lightGray);
  55.         pnlCtrl.add (btnStart);
  56.         pnlCtrl.add (btnStop);
  57.         pnlCtrl.add (new Label(""));
  58.         pnlCtrl.add (new Button ("1"));
  59.         pnlCtrl.add (new Button ("2"));
  60.         pnlCtrl.add (new Button ("3"));
  61.         pnlCtrl.add (new Button ("4"));
  62.         pnlCtrl.add (new Button ("5"));
  63.         pnlCtrl.add (new Button ("6"));
  64.         pnlCtrl.add (new Button ("7"));
  65.         pnlCtrl.add (lblThreshhold);
  66.         pnlCtrl.add (lblImmStates);
  67.         pnlCtrl.add (lblInfStates);
  68.         setLayout (new BorderLayout());
  69.         add ("East",  pnlCtrl);
  70.  
  71.     // Buttons disablen
  72.         btnStop.disable();
  73.         btnCont.disable();
  74.  
  75.     //
  76.         initCells(1);
  77.     }
  78.  
  79.     /** Override Applet Class' paint method */
  80.     public synchronized void paint(Graphics g){
  81.         paintCells(osGraphics);
  82.         g.drawImage(im, 0, 0, null);
  83.     }
  84.  
  85.     /** Initiales Gitter setzen */
  86.     private void initCells(int mode) {
  87.         arraySize  = 40;
  88.         cells      = null;
  89.         next       = null;
  90.         cells      = new byte [arraySize][arraySize];
  91.         next       = new byte [arraySize][arraySize];
  92.         cellHeight = size().height / arraySize;
  93.         cellWidth  = size().height / arraySize;
  94.  
  95.         for ( int line = 0; line < arraySize; ++line ) {
  96.             for ( int col = 0; col < arraySize; ++col )
  97.                 cells[col][line] = next[col][line] = 0;
  98.         }
  99.  
  100.         switch (mode) {
  101.             case 1:
  102.                 waitTime     = 60;
  103.                 threshHold   = 1;
  104.                 immStates    = 1;
  105.                 infStates    = 1;
  106.                 cells[17][17] = 1;
  107.                 cells[17][18] = 2;
  108.                 cells[21][21] = 2;
  109.                 cells[21][22] = 1;
  110.                 cells[24][20] = 2;
  111.                 cells[25][20] = 1;
  112.                 break;
  113.             case 2:
  114.                 threshHold   = 3;
  115.                 immStates    = 2;
  116.                 infStates    = 4;
  117.                 cells[18][19] =
  118.                 cells[18][20] =
  119.                 cells[19][19] =
  120.                 cells[19][20] =
  121.                 cells[20][19] =
  122.                 cells[20][20] = 1;
  123.                 break;
  124.             case 3:
  125.                 threshHold    = 3;
  126.                 immStates     = 2;
  127.                 infStates     = 4;
  128.                 cells[18][19] =
  129.                 cells[18][20] =
  130.                 cells[18][21] =
  131.                 cells[19][19] =
  132.                 cells[19][20] =
  133.                 cells[19][21] =
  134.                 cells[20][19] =
  135.                 cells[20][20] =
  136.                 cells[20][21] = 1;
  137.                 break;
  138.             case 4:
  139.                 threshHold    = 2;
  140.                 immStates     = 1;
  141.                 infStates     = 1;
  142.                 cells[19][17] =
  143.                 cells[18][18] =
  144.                 cells[17][19] =
  145.                 cells[20][22] =
  146.                 cells[21][21] =
  147.                 cells[22][20] =1;
  148.                 break;
  149.             case 5:
  150.                 threshHold  = 3;
  151.                 immStates   = 5;
  152.                 infStates   = 5;
  153.                 cells[23][15] = 9;
  154.                 cells[24][15] = 8;
  155.                 cells[25][15] = 3;
  156.                 cells[26][15] = 1;
  157.                 cells[22][16] = 10;
  158.                 cells[23][16] = 8;
  159.                 cells[24][16] = 7;
  160.                 cells[25][16] = 4;
  161.                 cells[26][16] = 2;
  162.                 cells[22][17] = 7;
  163.                 cells[23][17] = 6;
  164.                 cells[24][17] = 5;
  165.                 cells[25][17] = 3;
  166.                 cells[26][17] = 1;
  167.                 cells[22][18] = 3;
  168.                 cells[23][18] = 4;
  169.                 cells[24][18] = 3;
  170.                 cells[25][18] = 2;
  171.                 cells[22][19] = 1;
  172.                 cells[23][19] = 2;
  173.                 cells[24][19] = 1;
  174.                 break;
  175.             case 6:
  176.                 threshHold   = 2;
  177.                 immStates    = 3;
  178.                 infStates    = 2;
  179.                 cells[17][19] = 3;
  180.                 cells[18][19] = 4;
  181.                 cells[19][19] = 3;
  182.                 cells[17][20] = 2;
  183.                 cells[18][20] = 1;
  184.                 cells[19][20] = 2;
  185.                 break;
  186.             case 7:
  187.                 threshHold   = 2;
  188.                 immStates    = 3;
  189.                 infStates    = 2;
  190.                 cells[17][19] = 4;
  191.                 cells[18][19] = 5;
  192.                 cells[19][19] = 4;
  193.                 cells[17][20] = 1;
  194.                 cells[18][20] = 2;
  195.                 cells[19][20] = 1;
  196.                 break;
  197.         } // switch
  198.  
  199.         lblThreshhold.setText ("s = "+Integer.toString(threshHold));
  200.         lblImmStates .setText ("g = "+Integer.toString(immStates));
  201.         lblInfStates .setText ("a = "+Integer.toString(infStates));
  202.         initPaint  = true;
  203.     }
  204.  
  205.     private boolean isHealthy (byte cell) {
  206.         return cell == 0;
  207.     }
  208.  
  209.     private boolean isInfectious (byte cell) {
  210.         return cell > 0  &&  cell <= infStates;
  211.     }
  212.  
  213.     private boolean isImmune (byte cell) {
  214.         return cell > infStates;
  215.     }
  216.  
  217.     private byte nextState (byte cell) {
  218.         return ( cell < infStates + immStates ) ? ++cell : (byte)0;
  219.     }
  220.  
  221.     private void calculateCells (){
  222.         for ( int line = 1; line < arraySize - 1; ++line ) {
  223.             for ( int col = 1; col < arraySize - 1; ++col ) {
  224.                 if ( !isHealthy(cells[col][line]) )
  225.                     next[col][line] = nextState(cells[col][line]);
  226.                 else if ( calculateNeighbours(col,line) >= threshHold )
  227.                     next[col][line] = 1;
  228.             }
  229.         }
  230.         for ( int line = 0; line < arraySize; ++line )
  231.             for ( int col = 0; col < arraySize; ++col ) 
  232.                 cells[col][line] = next [col][line];
  233.     }
  234.  
  235.     private int calculateNeighbours (int col, int line){
  236.         int    sum = 0;
  237.  
  238.         for ( int i = line - 1; i <= line + 1; ++i )
  239.             for ( int j = col - 1; j <= col + 1; ++j )
  240.                 if ( isInfectious (cells[j][i]) )
  241.                     ++sum;
  242.         return sum;
  243.     }
  244.  
  245.     private void paintCells (Graphics g){
  246.  
  247.         if ( initPaint ) {
  248.             g.setColor(Color.white);
  249.             g.fillRect(0, 0, arraySize * cellWidth, arraySize * cellHeight);
  250.             initPaint = false;
  251.         }
  252.  
  253.         for ( int line = 0; line < arraySize; ++line ) {
  254.             for ( int col = 0; col < arraySize; ++col ) {
  255.                 byte cell     = cells[col][line];
  256.  
  257.                 cell = cells[col][line];
  258.                 if ( isInfectious (cell) )
  259.                     g.setColor(new Color(255 - 128 * (cell - 1) / infStates,0,0));
  260.                 else if ( isHealthy (cell) )
  261.                     g.setColor(Color.white);
  262.                 else {
  263.                     int c = 124 + 100 * (cell - infStates - 1) / immStates;
  264.                     g.setColor(new Color(c,c,c));
  265.                 }
  266.                 g.fillRect(col * cellWidth, line * cellHeight, cellWidth, cellHeight);
  267.             }
  268.         }
  269.     }
  270.     synchronized void calcNPaint()
  271.     {
  272.         calculateCells();
  273.         repaint();
  274.     }
  275.  
  276.     // Change coordinates and repaint
  277.     public void run(){
  278.         while(ttapeThread != null){
  279.             try {
  280.                 Thread.sleep (waitTime);
  281.             }
  282.             catch (InterruptedException e) {
  283.             }
  284.             calcNPaint();
  285.         }
  286.     }
  287.  
  288.     // Re-paint when buffer is updated
  289.     public void update(Graphics g) {
  290.         paint(g);
  291.     }
  292.  
  293.     // Handle mouse clicks
  294.     public boolean handleEvent(Event evt) {
  295.  
  296.     // Button-Events behandeln
  297.         if ( evt.target instanceof Button ) {
  298.             try {
  299.                 Integer    buttonNumber = new Integer ((String)evt.arg);
  300.  
  301.                 if ( buttonNumber.intValue() >= 1 && buttonNumber.intValue() <= 9 ) {
  302.                     if ( ttapeThread != null ) {
  303.                         ttapeThread.stop();
  304.                         ttapeThread = null;
  305.                     }
  306.                     initCells(buttonNumber.intValue());
  307.                     repaint();
  308.                     showStatus ("Press Start to run the automata");
  309.                 }
  310.             }
  311.  
  312.         // Button nicht numerisch
  313.             catch (NumberFormatException e) {
  314.                 if ( (String)evt.arg == "Start" ) {
  315.                     ttapeThread = new Thread(this);
  316.                     ttapeThread.start();
  317.                     threadRunning = true;
  318.                 }
  319.                 else if ( (String)evt.arg == "Stop" ) {
  320.                     ttapeThread.stop();
  321.                     ttapeThread = null;
  322.                     threadRunning = false;
  323.                 }
  324.             }
  325.  
  326.         // Stop/Continue-Buttons de-/aktivieren
  327.             if ( ttapeThread == null ) {
  328.                 btnStart.enable();
  329.                 btnStop .disable();
  330.             }
  331.             else {
  332.                 btnStart.disable();
  333.                 btnStop .enable();
  334.             }
  335.  
  336.             return true;
  337.         }
  338.         else
  339.             return super.handleEvent(evt);
  340.     }
  341.  
  342.     // Stop thread then clean up before close
  343.     public void stop(){
  344.         if(ttapeThread != null)
  345.             ttapeThread.stop();
  346.         ttapeThread = null;
  347.     }
  348.  
  349. } // End TickerTape
  350.  
  351. // ----------------------------------------------------------------------------
  352. // $Log: cell2.java $
  353. // Revision 1.5  1996/12/11 20:30:16  moroff
  354. // Experimentieren mit Thread-Kontrolle
  355. //
  356. // Revision 1.4  1996/11/26 22:46:44  moroff
  357. // Farbumsetzung
  358. //
  359. // Revision 1.3  1996/11/26 21:50:31  moroff
  360. // Mehrere Beispiele
  361. //
  362. // Revision 1.2  1996/11/22 23:45:50  moroff
  363. // Kosmetik an den RCS-Keywords
  364. //
  365. // Revision 1.1  1996/11/22 23:44:26  moroff
  366. // Initial revision
  367. //
  368. // ----------------------------------------------------------------------------
  369.